sumaN :: [Int] -> Int -> Bool
sumaN lista suma = suma == foldr (+) 0 lista

todasLasListasDeLongYElemMaxN :: Int -> [[Int]]
todasLasListasDeLongYElemMaxN 0 = []
todasLasListasDeLongYElemMaxN long = todasLasListasDeLongYElemMaxN' (todasLasListasDeLong1 long)  1 long

todasLasListasDeLongYElemMaxN' :: [[Int]] -> Int -> Int -> [[Int]]
todasLasListasDeLongYElemMaxN' lista longitudActual longitud 	| longitudActual == longitud = lista
								| otherwise = lista ++ (todasLasListasDeLongYElemMaxN' listasConUnElementoMas (longitudActual+1) longitud) 
    where listasConUnElementoMas = agregarUnElemACadaUna lista longitud

todasLasListasDeLong1 :: Int -> [[Int]]
todasLasListasDeLong1 maximo = [[x] | x <- [1..maximo]]

agregarUnElemACadaUna :: [[Int]] -> Int -> [[Int]]
agregarUnElemACadaUna [] maximo = []
agregarUnElemACadaUna (xs:xxs) maximo = [[x]++xs | x <- [1..maximo]] ++ agregarUnElemACadaUna xxs maximo

listasQueSuman :: Int -> [[Int]]
listasQueSuman n = [l | l <- todasLasListasDeLongYElemMaxN n, sumaN l n]




